home *** CD-ROM | disk | FTP | other *** search
/ By Popular Request 2.0 / By Popular Request 2.0 (Arsenal Computer).ISO / amiga_3 / gdsntxrs.lha / AmigaE_Parser / e.parser.asm < prev    next >
Assembly Source File  |  1995-05-31  |  6KB  |  299 lines

  1. ; e.parser - GoldED syntax parser for the Amiga E Programming Language
  2. ;
  3. ; ⌐ 1995 by Leon Woestenberg (leon@stack.urc.tue.nl). Freeware.
  4. ;
  5. ; Assembled using the PhxAss shareware macro assembler by Frank Wille.
  6. ;
  7. ; The Amiga E Compiler is copyrighted by Wouter van Oortmerssen.
  8. ; GoldED is copyrighted by Dietmar Eilert.
  9.  
  10.   NOLIST
  11.   ; system includes
  12.   INCLUDE exec/initializers.i
  13.   INCLUDE exec/resident.i
  14.   INCLUDE exec/libraries.i
  15.   INCLUDE exec_lib.i
  16.  
  17.   ; golded includes
  18.   INCLUDE GOLDED:API/include/golded.i
  19.   INCLUDE GOLDED:Syntax/Developer/include/scanlib.i
  20.  
  21.   ; revision include
  22.   INCLUDE e.parser_rev.i
  23.   LIST
  24.  
  25.   ; ebase structure
  26.   STRUCTURE ebase,PB_SIZE
  27.     ULONG ebase_seglist
  28.     ULONG ebase_execbase
  29.     LABEL ebase_SIZE
  30.  
  31. ; fail when run as executable
  32. first_address:
  33.   moveq #-1,d0
  34.   rts
  35.  
  36. ; romtag (resident) structure
  37. romtag:
  38.   dc.w RTC_MATCHWORD
  39.   dc.l romtag
  40.   dc.l endcode
  41.   dc.b RTF_AUTOINIT
  42.   dc.b VERSION
  43.   dc.b NT_LIBRARY
  44.   dc.b 0
  45.   dc.l libraryname
  46.   dc.l idstring
  47.   dc.l inittable
  48.  
  49. ; we are RTF_AUTOINIT, so we present an init table
  50.   EVEN
  51. inittable:
  52.   dc.l ebase_SIZE
  53.   dc.l functable
  54.   dc.l datatable
  55.   dc.l initroutine
  56. functable:
  57. ; absolute pointers to device standard routines
  58.   dc.l Open
  59.   dc.l Close
  60.   dc.l Expunge
  61.   dc.l Null
  62. ; absolute pointers to infraface device i/o entries
  63.   dc.l MountScanner
  64.   dc.l StartScanner
  65.   dc.l CloseScanner
  66.   dc.l FlushScanner
  67.   dc.l SetupScanner
  68.   dc.l BriefScanner
  69.   dc.l ParseLine
  70.   dc.l UnparseLines
  71.   dc.l ParseSection
  72. ; function table end marker
  73.   dc.l -1
  74. datatable:
  75. ; initializes our library structure
  76. ; second argument to MakeLibrary
  77.   INITBYTE LN_TYPE,NT_LIBRARY
  78.   INITLONG LN_NAME,libraryname
  79.   INITBYTE LIB_FLAGS,LIBF_SUMUSED ! LIBF_CHANGED
  80.   INITWORD LIB_VERSION,VERSION
  81.   INITWORD LIB_REVISION,REVISION
  82.   INITLONG LIB_IDSTRING,idstring
  83.   INITLONG PB_MAGIC,PARSER_MAGIC
  84.   dc.l 0
  85. initroutine:
  86.   ; { d0 = ebase }
  87.   ; { a0 = seglist }
  88.   ; { a6 = execbase }
  89.   exg d0,a0
  90.   move.l d0,(ebase_seglist,a0)
  91.   move.l a6,(ebase_execbase,a0)
  92.   exg d0,a0
  93.   ; { d0 = ebase }
  94.   rts
  95.  
  96. Open:
  97.   ; { d0 = version }
  98.   ; { a6 = ebase }
  99.   ; we have another opener
  100.   addq.w #1,(LIB_OPENCNT,a6)
  101.   ; prevent delayed expunges
  102.   bclr.b #LIBB_DELEXP,(LIB_FLAGS,a6)
  103.   ; return ebase
  104.   move.l a6,d0
  105.   rts
  106.  
  107. Close:
  108.   ; set return value
  109.   moveq #0,d0
  110.   ; we lost one opener
  111.   subq.w #1,(LIB_OPENCNT,a6)
  112.   ; { Z = no openers }
  113.   bne .end
  114.   ; delayed expunge pending?
  115.   btst.b #LIBB_DELEXP,(LIB_FLAGS,a6)
  116.   ; { Z = no delayed expunge pending }
  117.   beq .noexpunge
  118.   bsr Expunge
  119. .noexpunge:
  120. .end:
  121.   rts
  122.  
  123. Expunge:
  124.   ;{ a6 = ebase }
  125.   movem.l d2/a5/a6,-(sp)
  126.   movea.l a6,a5
  127.   ;{ a5 = ebase }
  128.   movea.l (ebase_execbase,a5),a6
  129.   ;{ a6 = execbase }
  130.   tst.w (LIB_OPENCNT,a5)
  131.   ; if zero users, expunge now
  132.   beq .expungenow
  133.   ;{ at least one user left }
  134.   ; pend a delayed expunge and return 0
  135.   bset.b #LIBB_DELEXP,(LIB_FLAGS,a5)
  136.   moveq #0,d0
  137.   bra .end
  138. .expungenow:
  139.   ;{ no users left }
  140.   ; copy seglist into d2
  141.   move.l (ebase_seglist,a5),d2
  142.   ;{ d2 = pointer to our seglist }
  143.   movea.l a5,a1
  144.   ;{ a1 = ebase }
  145.   ; remove library from list
  146.   jsr (_LVORemove,a6)
  147.   ;{ we are no longer in the library list }
  148.   movea.l a5,a1
  149.   ;{ a1 = ebase }
  150.   moveq #0,d0
  151.   move.w (LIB_NEGSIZE,a5),d0
  152.   ;{ d0 = #bytes before library pointer }
  153.   suba.l d0,a1
  154.   ;{ a1 = first byte of our library }
  155.   add.w (LIB_POSSIZE,a5),d0
  156.   ;{ d0 = #bytes used by library }
  157.   jsr (_LVOFreeMem,a6)
  158.   ;{ d2 = pointer to our seglist }
  159.   move.l d2,d0
  160.   ;{ library no longer open }
  161.   ;{ d0 = pointer to our seglist }
  162. .end:
  163.   movem.l (sp)+,d2/a5/a6
  164.   rts
  165.  
  166. Null:
  167.   moveq #0,d0
  168.   rts
  169.  
  170. MountScanner:
  171.   lea (parserdata,pc),a0
  172.   move.l a0,d0
  173.   ;{ a0 = parserdata }
  174.   rts
  175. StartScanner:
  176.   ;{ d0 = syntaxstack }
  177.   rts
  178. CloseScanner:
  179. FlushScanner:
  180. SetupScanner:
  181. BriefScanner:
  182.   moveq #0,d0
  183.   rts
  184. ParseLine:
  185.   bchg.b #1,$bfe001
  186.   ;{ d0 = scanid }
  187.   ;{ a0 = linenode }
  188.   ;{ d1 = line }
  189.   tst.l (LINENODE_FOLD,a0)
  190.   bne .folded
  191.   move.w (LINENODE_LEN,a0),d1
  192. LENGTH EQUR d1
  193.   ;{ d1 = length }
  194.   beq .zerolength
  195.   move.l (LINENODE_TEXT,a0),a1
  196. TEXT EQUR a1
  197.   ;{ a1 = text }
  198. .leading:
  199.   cmpi.b #' ',(TEXT)
  200.   bne .trailing
  201.   adda.l #1,TEXT
  202.   subi.w #1,LENGTH
  203.   beq .nothingleft
  204.   bra .leading
  205.  
  206. .trailing:
  207.   ; check last character against space
  208.   cmpi.b #' ',(-1,TEXT,LENGTH)
  209.   ; if no space then proceed
  210.   bne .comment
  211.   ; decrease length
  212.   subi.w #1,LENGTH
  213.   ; if zero length then leave
  214.   beq .nothingleft
  215.   ; check next last character
  216.   bra .trailing
  217.  
  218. .comment:
  219.   ;{ a1 = text (trimmed) }
  220.   ;{ d1 = length (trimmed) }
  221.   cmpi.b #'-',(TEXT)
  222.   beq .second
  223.   adda.l #1,TEXT
  224.   subi.w #1,LENGTH
  225.   beq .nothingleft
  226.   bra .comment
  227. .second:
  228.   cmpi.b #'>',(1,TEXT)
  229.   beq .gotone
  230.   adda.l #1,TEXT
  231.   subi.w #1,LENGTH
  232.   beq .nothingleft
  233.   bra .comment
  234. .gotone:
  235.   ;{ a0 = linenode }
  236.   suba.l (LINENODE_TEXT,a0),TEXT
  237.   ;{ a1 = start }
  238.   movea.l d0,a0
  239.   ;{ a0 = syntax stack }
  240.   ;{ TEXT = start column }
  241.   move.w TEXT,(SC_START,a0)
  242.   add.l TEXT,LENGTH
  243.   subq #1,LENGTH
  244.   ;{ LENGTH = end column }
  245.   move.w LENGTH,(SC_END,a0)
  246.   move.w #1,(SC_LEVEL,a0)
  247.   move.l #0,(SYNTAXCHUNK_SIZE,a0)
  248.   move.w #0,(SYNTAXCHUNK_SIZE+SC_LEVEL,a0)
  249.   ;{ d0 = syntax stack }
  250.   bra .end
  251. .nocomment:
  252. .nothingleft:
  253. .zerolength:
  254. .folded:
  255.   moveq #0,d0
  256. .end:
  257.   rts
  258.  
  259. UnparseLines:
  260.   rts
  261. ParseSection:
  262.   rts
  263.  
  264. libraryname:
  265.   dc.b 'e.parser',0
  266. idstring:
  267.   VSTRING
  268.  
  269.   EVEN
  270. parserdata:
  271.   dc.l SCANLIBVERSION
  272.   dc.l VERSION
  273.   dc.l 0 ;*** REVISION should be here, but GoldED rejects it then ?! ***
  274.   dc.l info
  275.   dc.w 2
  276.   dc.l namelist
  277.   dc.l colorlist
  278.   dc.w 0
  279.   dc.l 0
  280. info:
  281.   dc.b 'Amiga E Parser',0
  282.   EVEN
  283. namelist:
  284.   dc.l standard
  285.   dc.l onelinercomment
  286.   dc.l 0
  287. standard:
  288.   dc.b 'Standard',0
  289. onelinercomment:
  290.   dc.b 'Single line comment ( -> bla bla )',0
  291.   EVEN
  292. colorlist:
  293.   dc.l $000
  294.   dc.l $fff
  295.   dc.l 0
  296. endcode:
  297.  
  298.  
  299.